import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:hive/hive.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:todo/models/task_model.dart';
import 'package:todo/views/home_screen.dart';

void main() async {
  // `WidgetsFlutterBinding.ensureInitialized()` 是 Flutter 框架中的一个重要方法，用于确保 Flutter 框架的 `WidgetsBinding` 已经被初始化。
  // `WidgetsBinding` 是 Flutter 框架中一个核心的绑定类，它负责将 Flutter 框架与底层的平台（如 Android、iOS 等）进行连接和交互。
  // 在使用 Flutter 的一些功能之前，必须确保 `WidgetsBinding` 已经被初始化，例如：
  // - 初始化插件系统，许多 Flutter 插件依赖于 `WidgetsBinding` 来与原生代码进行通信。
  // - 访问 Flutter 框架的一些全局状态和服务。
  // - 在异步操作中，确保 Flutter 框架已经准备好处理 UI 渲染和事件。
  // 通常，这个方法会在 `main` 函数中尽早调用，以确保在应用程序启动时 `WidgetsBinding` 已经被正确初始化。
  WidgetsFlutterBinding.ensureInitialized();
  // 初始化 Hive 数据库
  try {
    await Hive.initFlutter();
    // 注册 Task 类型的适配器
    // 确保导入了 TaskAdapter 所在的文件
    // 确保适配器已注册
    if (!Hive.isAdapterRegistered(0)) {
      Hive.registerAdapter(TaskAdapter());
    }
    Hive.registerAdapter(TaskAdapter());
    // 打开名为 'todoTasks' 的 Hive 盒子，用于存储 Task 类型的数据
    await Hive.openBox<Task>('todoTasks').catchError((error) {
      print('Error opening box: $error');
      Hive.deleteBoxFromDisk('todoTasks');
      return Hive.openBox<Task>('todoTasks');
    });
  } catch (e) {
    print('Hive initialization failed: $e');
  }
  ;
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'To-Do',
      theme: ThemeData(
        // 定义应用程序的主题
        primarySwatch: Colors.deepPurple,
        // 定义应用程序的视觉密度，用于调整应用程序的布局和字体大小
        // `VisualDensity.adaptivePlatformDensity` 是一个自适应的视觉密度，它会根据当前平台的密度来调整应用程序的布局和字体大小
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: HomeScreen(),
    );
  }
}
